package org.xml.parser.DOM;

import java.io.IOException;
import java.util.ArrayList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.Book;
import org.xml.sax.SAXException;

/**
 * 该类用DOM的方式解析xml，将其保存到java对象
 *
 */
public class DOMTest {
	private static Book book = null;// 声明一个全局的book对象
	private static ArrayList<Book> books = new ArrayList<Book>();

	public static void main(String[] args) {
		domParser();
	}

	public static void domParser() {
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		try {
			DocumentBuilder db = dbf.newDocumentBuilder();
			Document document = db.parse("books1.xml");
			NodeList bookList = document.getElementsByTagName("book");// 获取所有的book节点的集合
			// 遍历每一个book节点
			for (int i = 0; i < bookList.getLength(); i++) {
				book = new Book();// 每遇到一个book节点就创建一个book对象
				Node bookNode = (Node) bookList.item(i);// 通过item（i）方法获取一个book节点
				NamedNodeMap attributes = bookNode.getAttributes();// 获取book节点的属性集合

				// 遍历book节点的属性
				for (int j = 0; j < attributes.getLength(); j++) {
					Node attribute = attributes.item(j);// 通过item（index）方法获取NamedNodeMap中的某个属性
					if ("id".equals(attribute.getNodeName())) {
						book.setId(attribute.getNodeValue());
					}
				}

				// 解析book节点的子节点
				NodeList childNodes = bookNode.getChildNodes();
				// 遍历childNodes获取每个节点的节点名和节点值
				for (int j = 0; j < childNodes.getLength(); j++) {
					// 区分textNode和elementNode
					if (childNodes.item(j).getNodeType() == Node.ELEMENT_NODE) {
						if ("name".equals(childNodes.item(j).getNodeName())) {
							book.setName(childNodes.item(j).getFirstChild()
									.getNodeValue());
						} else if ("author".equals(childNodes.item(j)
								.getNodeName())) {
							book.setAuthor(childNodes.item(j).getTextContent());
						} else if ("year".equals(childNodes.item(j)
								.getNodeName())) {
							book.setYear(childNodes.item(j).getTextContent());
						} else if ("price".equals(childNodes.item(j)
								.getNodeName())) {
							book.setPrice(childNodes.item(j).getTextContent());
						} else if ("language".equals(childNodes.item(j)
								.getNodeName())) {
							book.setLanguage(childNodes.item(j)
									.getTextContent());
						}
					}
				}
				books.add(book);// 结束一本书的遍历的时候将其加入ArrayList中
			}
			// 输出arrayList中的book对象
			System.out.println("arrayList中一共有" + books.size() + "本书！");
			for (Book book : books) {
				System.out.println(book);
			}
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}
